package com.szjz.elasticsearch.eshelper.base.wrapper.service;



import com.szjz.elasticsearch.eshelper.page.Page;
import com.szjz.elasticsearch.eshelper.wrapper.ESQueryWrapper;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 史博
 * @desc 按月分片分库
 * @date 2021/2/26 10:51 周五
 */
public interface MonthWrapperService<T> {


	/*====================================================================*/
	/*================================== SAVE ===============================*/
	/*====================================================================*/

	/**
	 * 按照月分片 保存or更新
	 */
	Boolean saveOrUpdateAcMonth(T t);

	/**
	 * 按照月分片批量插入or更新数据
	 * 按照数据的创建时间来分片
	 * ts中的数据创建时间必须是同一天的
	 * docId = _id
	 *
	 * @param ts
	 */
	Boolean saveOrUpdateBatchAcMonth(List<T> ts);

	/*====================================================================*/
	/*================================== T ===============================*/
	/*====================================================================*/

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @return 查询某一个月返回的数据
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, Date date);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param yearMonth 年月 格式：2020-02 自然月份对应的索引库结尾日期
	 * @return 查询某一个月返回的数据
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, String yearMonth);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @return 某一时间段的数据集合
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param startYMD 开始时间
	 * @param endYMD   结束时间
	 * @return 某一时间段的数据集合
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, String startYMD, String endYMD);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param yearMonth 索引库对应的分片时间
	 * @param size      返回结果集的最大数量
	 * @return 某一天的数据集合
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, String yearMonth, Integer size);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @param size    返回结果集的最大数量
	 * @return 某一天的数据集合
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, Date date, Integer size);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param startYMD 开始时间
	 * @param endYMD   结束时间
	 * @param size     返回结果集的最大数量
	 * @return 某一时间段的数据集合
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, String startYMD, String endYMD, Integer size);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param size      返回结果集的最大数量
	 * @return 某一时间段的数据集合
	 */
	List<T> selectAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer size);

	/*====================================================================*/
	/*=============================== T-PAGE =============================*/
	/*====================================================================*/

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param date     索引库对应的分片时间
	 * @param pageNum  当前页
	 * @param pageSize 每页容量
	 * @return 查询某一个月之内的数据
	 */
	Page<T> pageAcMonth(ESQueryWrapper<T> wrapper, Date date, Integer pageNum, Integer pageSize);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param yearMonth 年月 格式：2020-02 自然月份对应的索引库结尾日期
	 * @param pageNum   当前页
	 * @param pageSize  每页容量
	 * @return 查询某一个月返回的数据
	 */
	Page<T> pageAcMonth(ESQueryWrapper<T> wrapper, String yearMonth, Integer pageNum, Integer pageSize);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param pageNum   当前页
	 * @param pageSize  每页容量
	 * @return 某一时间段的数据集合
	 */
	Page<T> pageAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer pageNum, Integer pageSize);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param startYMD 开始时间
	 * @param endYMD   结束时间
	 * @param pageNum  当前页
	 * @param pageSize 每页容量
	 * @return 某一时间段的数据集合
	 */
	Page<T> pageAcMonth(ESQueryWrapper<T> wrapper, String startYMD, String endYMD, Integer pageNum, Integer pageSize);


	/*====================================================================*/
	/*================================ MAP ===============================*/
	/*====================================================================*/

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, Date date);


	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param yearMonth 年月 格式：2020-02 自然月份对应的索引库结尾日期
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, String yearMonth);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param startYMD 开始时间
	 * @param endYMD   结束时间
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, String startYMD, String endYMD);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param yearMonth 索引库对应的分片时间
	 * @param size      返回结果集的最大数量
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, String yearMonth, Integer size);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @param size    返回结果集的最大数量
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, Date date, Integer size);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param startYMD 开始时间
	 * @param endYMD   结束时间
	 * @param size     返回结果集的最大数量
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, String startYMD, String endYMD, Integer size);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param size      返回结果集的最大数量
	 * @return 集合 map
	 */
	List<Map<String, Object>> selectMapAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer size);


	/*====================================================================*/
	/*============================== MAP-PAGE ============================*/
	/*====================================================================*/

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param date     索引库对应的分片时间
	 * @param pageNum  当前页
	 * @param pageSize 每页容量
	 * @return 分页 map
	 */
	Page<Map<String, Object>> pageMapAcMonth(ESQueryWrapper<T> wrapper, Date date, Integer pageNum, Integer pageSize);


	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param yearMonth 年月 格式：2020-02 自然月份对应的索引库结尾日期
	 * @param pageNum   当前页
	 * @param pageSize  每页容量
	 * @return 分页 map
	 */
	Page<Map<String, Object>> pageMapAcMonth(ESQueryWrapper<T> wrapper, String yearMonth, Integer pageNum, Integer pageSize);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param pageNum   当前页
	 * @param pageSize  每页容量
	 * @return 分页 map
	 */
	Page<Map<String, Object>> pageMapAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer pageNum, Integer pageSize);

	/**
	 * 通过包装类查询按月分片的索引库集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param startYMD 开始时间
	 * @param endYMD   结束时间
	 * @param pageNum  当前页
	 * @param pageSize 每页容量
	 * @return 分页 map
	 */
	Page<Map<String, Object>> pageMapAcMonth(ESQueryWrapper<T> wrapper, String startYMD, String endYMD, Integer pageNum, Integer pageSize);

	/*====================================================================*/
	/*=============================== count ==============================*/
	/*====================================================================*/

	/**
	 * count
	 * 可用于非等查询
	 *
	 * @param wrapper 将要查询的条件封装到ESQueryWrapper中
	 * @param date    日期 决定了查询的索引库
	 * @return
	 */
	Long countAcMonth(ESQueryWrapper<T> wrapper, Date date);

	/**
	 * count
	 * 可用于非等查询
	 *
	 * @param wrapper 将要查询的条件封装到ESQueryWrapper中
	 * @param YM      年月 决定了查询的索引库 yyyy-MM
	 * @return
	 */
	Long countAcMonth(ESQueryWrapper<T> wrapper, String YM);

	/**
	 * count
	 * 可用于非等查询
	 *
	 * @param wrapper   将要查询的条件封装到ESQueryWrapper中
	 * @param startDate 日期 决定了查询的起始索引库
	 * @param endDate   日期 决定了查询的结束索引库
	 * @return
	 */
	Long countAcMonth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate);

	/**
	 * count
	 * 可用于非等查询
	 *
	 * @param wrapper 将要查询的条件封装到ESQueryWrapper中
	 * @param startYM 年月 决定了查询的起始索引库 yyyy-MM
	 * @param endYM   年月 决定了查询的结束索引库 yyyy-MM
	 * @return
	 */
	Long countAcMonth(ESQueryWrapper<T> wrapper, String startYM, String endYM);

}
